package buffer

import "os"

var (
	text = "Fast is slow, slow is smooth and smooth is fast. \n"
)

// 带缓冲的 FileWriter [不支持并发. bufio.NewWriter 支持并发]
type BufferFileWriter struct {
	buffer         []byte
	bufferEndIndex int
	fout           *os.File
}

func NewWriter(fout *os.File, bufferSize int) *BufferFileWriter {
	return &BufferFileWriter{
		buffer:         make([]byte, bufferSize), // len = cap = bufferSize
		bufferEndIndex: 0,
		fout:           fout,
	}
}

// 把 buffer 中的内容全部写入磁盘
func (w *BufferFileWriter) Flush() {
	w.fout.Write(w.buffer[0:w.bufferEndIndex]) // 将 buffer 中的内容写入磁盘
	w.bufferEndIndex = 0                       // 清空buffer
}

// 向文件中写入内容，大概率只写入到了缓存中，等到达到缓冲区上线或者执行 flush 才将数据写入磁盘
func (w *BufferFileWriter) Write(cont []byte) {
	if len(cont) >= len(w.buffer) {
		// 写入内容大于缓存空间
		w.Flush()
		w.fout.Write(cont)
	} else {
		if w.bufferEndIndex+len(cont) > len(w.buffer) {
			// 先判断 buffer 剩余容量是否写的下 写不下直接将 buffer 先执行持久化
			w.Flush()
		}
		// copy2(w.buffer, w.bufferEndIndex, cont) // 自定义方法
		copy(w.buffer[w.bufferEndIndex:], cont) // Go 内置函数和自己写的等价，但更高效
		w.bufferEndIndex += len(cont)
	}
}

// 把src拷贝到dest[index:]里去
func copy2(dest []byte, index int, src []byte) {
	for i := 0; i < len(src); i++ {
		dest[index+i] = src[i]
	}
}

// 向文件中写入内容。（大概率只是写入了缓冲，还没有真正写入磁盘）
func (writer *BufferFileWriter) WriteString(content string) {
	writer.Write([]byte(content))
}
